﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using DTO;
using BUS;

namespace GUI
{
    public partial class FormCapNhatBanDat : Form
    {
        public NHANVIENDTO NVDTO;
        public List<TANGDTO> dst;
        public List<BANDTO> dsb;
        public TANGDTO TDTO;
        public BANDTO BDTO;
        bool lv;
        public delegate void GetString(String Tang, String Ban);
        public GetString CapNhat;
        public int SoKhach, NVDatBan;
        public string Tang, Ban;
        public FormCapNhatBanDat()
        {
            InitializeComponent();
        }
        public void LayDanhSachTang()
        {
            int i;
            cboDSTang.Items.Clear();
            cboDSTang.Text = "";
            dst = new List<TANGDTO>();
            TANGBUS TBUS = new TANGBUS();
            dst = TBUS.LayDSTang();
            //Ưu tiên tầng hiện tại
            //Xem trong dst có tầng này chưa
            bool check = false;
            for (i = 0; i < dst.Count; i++)
            {
                if (dst[i].TenTang == TDTO.TenTang)
                {
                    check = true;
                    break;
                }
            }
            
            //Số khách mới vẫn có thể chứa trong bàn của tầng hiện tại
            if ((txtSoKhach.Text != "" && Convert.ToInt32(txtSoKhach.Text) <= BDTO.SucChua) || (txtSoKhach.Text == ""))
            {
                if (check)//Đã có tầng này trong danh sách
                {
                    dst.RemoveAt(i);//Xóa tầng này đi
                }
                i = 1;
                dst.Insert(0, TDTO);//Thêm tầng hiện tại lên đầu
                cboDSTang.Items.Add(dst[0].TenTang);
            }
            else i = 0;
            //Thêm vào cboDSTang
            for (; i < dst.Count; i++)
            {
                if (dst[i].TinhTrang == 0 || dst[i].TinhTrang == -1)
                {
                    cboDSTang.Items.Add(dst[i].TenTang);
                }
            }
            if (cboDSTang.Items.Count > 0) cboDSTang.SelectedIndex = 0;
            else
            {
                cboDSBanTrong.Items.Clear();
                cboDSBanTrong.Text = "";
                txtSucChua.Text = "";
            };
        }
        public void LayDanhSachTang2()
        {
            int i;
            //Lấy danh sách tâng có bàn trống vừa số khách/các tầng còn lại
            cboDSTang.Items.Clear();
            cboDSTang.Text = "";
            dst = new List<TANGDTO>();
            TANGBUS TBUS = new TANGBUS();
            dst = TBUS.LayDSTang2(Convert.ToInt32(txtSoKhach.Text));
            //Ưu tiên tầng hiện tại
            //Xem trong dst có tầng này chưa
            bool check = false;
            for (i = 0; i < dst.Count; i++)
            {
                if (dst[i].TenTang == TDTO.TenTang)
                {
                    check = true;
                    break;
                }
            }
            //Số khách mới vẫn có thể chứa trong tầng hiện tại
            if ((txtSoKhach.Text != "" && Convert.ToInt32(txtSoKhach.Text) <= BDTO.SucChua) || (txtSoKhach.Text == ""))
            {
                if (check)
                {
                    dst.RemoveAt(i);
                }
                i = 1;
                dst.Insert(0, TDTO);
                cboDSTang.Items.Add(dst[0].TenTang);
            }
            else i = 0;
            //Thêm vào cboDSTang
            for (; i < dst.Count; i++)
            {
                if (dst[i].TinhTrang == 0 || dst[i].TinhTrang==-1)
                {
                    cboDSTang.Items.Add(dst[i].TenTang);
                }
            }
            if (cboDSTang.Items.Count > 0) cboDSTang.SelectedIndex = 0;
            else
            {
                cboDSBanTrong.Items.Clear();
                cboDSBanTrong.Text = "";
                txtSucChua.Text = "";
            };
        }
        public void LayDanhSachBan()
        {
            int i;
            cboDSBanTrong.Items.Clear();
            cboDSBanTrong.Text = "";
            dsb = new List<BANDTO>();
            BANBUS BBUS = new BANBUS();
            if (cboDSTang.SelectedIndex == -1) return;
            dsb = BBUS.LayDSBan(dst[cboDSTang.SelectedIndex]);
            //Ưu tiên bàn hiện tại
            bool check = false;
            //Xem trong dsb có bàn này chưa
            for (i = 0; i < dsb.Count; i++)
            {
                if (dsb[i].TenBan == BDTO.TenBan)
                {
                    check = true;
                    break;
                }
            }
            if (dst[cboDSTang.SelectedIndex].TenTang == TDTO.TenTang)
            {
                //Số khách mới vẫn có thể chứa trong bàn hiện tại
                bool check2 = true;
                string s = txtSoKhach.Text;
                for (int j = 0; j < s.Length; j++)
                {
                    if (char.IsDigit(s[j]) == false)
                    {
                        check2 = false;
                        break;
                    };
                }
                if (txtSoKhach.Text != "" && check2)
                {
                    int x = Convert.ToInt32(txtSoKhach.Text);
                    if (x < 1) check2 = false;
                }
                    
                if ((txtSoKhach.Text != "" && check2 && Convert.ToInt32(txtSoKhach.Text) <= BDTO.SucChua) || (txtSoKhach.Text == ""))
                {
                    if (check)
                    {
                        dsb.RemoveAt(i);
                    }
                    i = 1;
                    dsb.Insert(0, BDTO);
                    cboDSBanTrong.Items.Add(dsb[0].TenBan);
                }
                else i = 0;
            }
            else i = 0;
            //Thêm vào cboDSBanTrong
            for (; i < dsb.Count; i++)
            {
                if (dsb[i].SoKhach == 0)
                {
                    cboDSBanTrong.Items.Add(dsb[i].TenBan);
                }
            }
            if (cboDSBanTrong.Items.Count > 0) cboDSBanTrong.SelectedIndex = 0;
        }
        public void LayDanhSachBan2()
        {
            int i;
            //Lấy danh sách bàn trong tầng trên
            cboDSBanTrong.Items.Clear();
            cboDSBanTrong.Text = "";
            dsb = new List<BANDTO>();
            BANBUS BBUS = new BANBUS();
            if (cboDSTang.SelectedIndex == -1) return;
            dsb = BBUS.LayDSBan2(dst[cboDSTang.SelectedIndex], Convert.ToInt32(txtSoKhach.Text));
            //Ưu tiên bàn hiện tại
            bool check= false;
            //Xem trong dsb có bàn này chưa
            for (i = 0; i < dsb.Count; i++)
            {
                if (dsb[i].TenBan == BDTO.TenBan)
                {
                    check = true;
                    break;
                }
            }
            if (dst[cboDSTang.SelectedIndex].TenTang == TDTO.TenTang)
            {
                //Số khách mới vẫn có thể chứa trong bàn hiện tại
                if ((txtSoKhach.Text != "" && Convert.ToInt32(txtSoKhach.Text) <= BDTO.SucChua) || (txtSoKhach.Text == ""))
                {
                    if (check)
                    {
                        dsb.RemoveAt(i);
                    }
                    i = 1;
                    dsb.Insert(0, BDTO);
                    cboDSBanTrong.Items.Add(dsb[0].TenBan);
                }
                else i = 0;
            }
            else i = 0;
            //Thêm vào cboDSBanTrong
            for (; i < dsb.Count; i++)
            {
                if (dsb[i].SoKhach == 0)
                {
                    cboDSBanTrong.Items.Add(dsb[i].TenBan);
                }
            }
            if (cboDSBanTrong.Items.Count > 0) cboDSBanTrong.SelectedIndex = 0;
        }
        private void btnHuy_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        private void btnXong_Click(object sender, EventArgs e)
        {
            if (txtSoKhach.Text == "")
            {
                lv = true;
                txtSoKhach.BackColor = Color.Pink;
                txtSoKhach.Focus();
                return;
            }
            
            string s = txtSoKhach.Text;
            bool check = true;
            int i;
            for (i = 0; i < s.Length; i++)
            {
                if (char.IsDigit(s[i]) == false)
                {
                    check = false;
                    break;
                };
            }
            if (check)
            {
                int x = Convert.ToInt32(txtSoKhach.Text);
                if (x < 1) check = false;
            }
            if (check == false)
            {
                MessageBox.Show("Số khách không đúng.", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            if (cboDSBanTrong.SelectedIndex == -1)
            {
                MessageBox.Show("Vui lòng chọn bàn phù hợp.", "Thông báo", MessageBoxButtons.OK, MessageBoxIcon.Information);
                return;
            }
            HOADONDTO HDTO = new HOADONDTO();
            HOADONBUS HBUS = new HOADONBUS();
            HDTO = HBUS.LayThongTinHD(BDTO);
            HDTO.MaBan = dsb[cboDSBanTrong.SelectedIndex].MaBan;
            HDTO.SoKhach = Convert.ToInt32(txtSoKhach.Text);
            HDTO.MaNV = NVDTO.MaNV;
            if (HBUS.CapNhatThongTin(HDTO) < 1)
            {
                MessageBox.Show("Cập nhật không thành công.", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            this.Close();
            FormQLGoiMon frm = new FormQLGoiMon();
            CapNhat(cboDSTang.Text, cboDSBanTrong.Text);
        }
        private void FormCapNhatBanDat_Load(object sender, EventArgs e)
        {
            this.Text += " - NV: " + NVDTO.MaNV + " " + NVDTO.TenNV;
            //Lấy danh sách tầng
            LayDanhSachTang();
            //Lấy danh sách bàn
            LayDanhSachBan();
            txtSoKhach.Text = SoKhach.ToString();
            cboDSTang.SelectedItem = TDTO.TenTang;
            cboDSBanTrong.SelectedItem = BDTO.TenBan;
        }
        private void cboDSTang_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (txtSoKhach.Text == "")
            {
                LayDanhSachBan();
            }
            else
            {
                bool check = true;
                string s = txtSoKhach.Text;
                int i;
                for (i = 0; i < s.Length; i++)
                {
                    if (char.IsDigit(s[i]) == false)
                    {
                        check = false;
                        break;
                    };
                }
                if (check)
                {
                    int x = Convert.ToInt32(txtSoKhach.Text);
                    if (x < 1) check = false;
                }
                if (check)
                {
                    LayDanhSachBan2();
                }
                else
                {
                    LayDanhSachBan();
                }
            }
        }
        private void txtSoKhach_TextChanged(object sender, EventArgs e)
        {
            if (lv)
            {
                lv = false;
                txtSoKhach.BackColor = Color.White;
            }
            string s = txtSoKhach.Text;
            if (s == "")
            {
                LayDanhSachTang();
                return;
            }
            bool check = true;
            int i;
            for (i = 0; i < s.Length; i++)
            {
                if (char.IsDigit(s[i]) == false)
                {
                    check = false;
                    break;
                };
            }
            if (check == false || Convert.ToInt32(txtSoKhach.Text) <= 0)
            {
                lv = true;
                txtSoKhach.Focus();
                txtSoKhach.SelectionStart = 0;
                txtSoKhach.SelectionLength = txtSoKhach.TextLength;
                txtSoKhach.BackColor = Color.Pink;
                return;
            }
            LayDanhSachTang2();
        }
        private void cboDSTang_DrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawBackground();
            if (e.Index == -1) return;
            //Hết bàn
            if (dst[e.Index].TinhTrang==0)//Có khách còn bàn
            {
                e.Graphics.DrawString(cboDSTang.Items[e.Index].ToString(), cboDSTang.Font, System.Drawing.Brushes.Blue, new RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height));
            }
            else if (dst[e.Index].TinhTrang==-1)//Chưa có khách
                e.Graphics.DrawString(cboDSTang.Items[e.Index].ToString(), cboDSTang.Font, System.Drawing.Brushes.Blue, new RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height));
            else if (dst[e.Index].TinhTrang == 1)//Chưa có khách
                e.Graphics.DrawString(cboDSTang.Items[e.Index].ToString(), cboDSTang.Font, System.Drawing.Brushes.Red, new RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height));
            e.DrawFocusRectangle();
        }
        private void cboDSBanTrong_DrawItem(object sender, DrawItemEventArgs e)
        {
            e.DrawBackground();
            if (e.Index == -1) return;
            if (dsb[e.Index].SoKhach!=0)//Không có khách
            {
                e.Graphics.DrawString(cboDSBanTrong.Items[e.Index].ToString(), cboDSBanTrong.Font, System.Drawing.Brushes.Red, new RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height));
            }
            else
                e.Graphics.DrawString(cboDSBanTrong.Items[e.Index].ToString(), cboDSBanTrong.Font, System.Drawing.Brushes.Blue, new RectangleF(e.Bounds.X, e.Bounds.Y, e.Bounds.Width, e.Bounds.Height));
            e.DrawFocusRectangle();
        }
        private void cboNVDatBan_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btnXong_Click(sender, e);
            }
            else if (e.KeyCode == Keys.Escape)
            {
                this.Close();
            }
        }
        private void txtSoKhach_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btnXong_Click(sender, e);
            }
            else if (e.KeyCode == Keys.Escape)
            {
                this.Close();
            }
        }
        private void cboDSTang_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btnXong_Click(sender, e);
            }
            else if (e.KeyCode == Keys.Escape)
            {
                this.Close();
            }
        }
        private void cboDSBanTrong_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter)
            {
                btnXong_Click(sender, e);
            }
            else if (e.KeyCode == Keys.Escape)
            {
                this.Close();
            }
        }
        private void cboDSBanTrong_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (cboDSBanTrong.SelectedIndex == -1)
            {
                return;
            }
            txtSucChua.Text = dsb[cboDSBanTrong.SelectedIndex].SucChua.ToString();
        }
    }
}
